/**
 **************************************************************************************************************************
 * 
 **************************************************************************************************************************
 * @file RBHandle.h
 **************************************************************************************************************************/

#pragma once

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBHandle.h)
#endif


/**************************************************************************************************************************
 * Includes
 **************************************************************************************************************************/

/**************************************************************************************************************************
 * Forward declarations
 **************************************************************************************************************************/


/**************************************************************************************************************************
 * Classes
 **************************************************************************************************************************/
template <class T>
class RBHandle
{
public:

    uint16 Handle;

    RBHandle(uint16 handle=0xFFFF) : Handle(handle) {}
    ~RBHandle(){}
    RBHandle(const RBHandle& rhs) { Handle = rhs.Handle; }
    RBHandle& operator=(const RBHandle& rhs) { Handle = rhs.Handle;  return *this; }
    RBHandle& operator=(uint16 handle) { Handle = handle; return *this; }

    T*       operator-> ()       { return &T::Get(Handle); }
    const T* operator-> () const { return &T::Get(Handle); }
    T&       operator*  () { return T::Get(Handle); }
    const T& operator*  () const { return T::Get(Handle); }
             operator const T*() const { return &T::Get(Handle); }
             operator T*() { return &T::Get(Handle); }
    operator uint16() { return Handle; }

    bool     operator== (const RBHandle<T>& rhs) { return Handle == rhs.Handle; }

};
